<!doctype html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>深入理解 Full GC 后老年代空间变化</title>
    <link href="https://cdn.staticfile.org/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
    <link href="https://cdn.staticfile.org/tailwindcss/2.2.19/tailwind.min.css" rel="stylesheet">
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/mermaid@latest/dist/mermaid.min.js"></script>
    <style>
        body {
            font-family: 'Noto Sans SC', Tahoma, Arial, Roboto, "Droid Sans", "Helvetica Neue", "Droid Sans Fallback", "Heiti SC", "Hiragino Sans GB", Simsun, sans-serif;
            background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
            min-height: 100vh;
        }
        .hero-gradient {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        }
        .card-hover {
            transition: all 0.3s ease;
            border: 1px solid transparent;
        }
        .card-hover:hover {
            transform: translateY(-5px);
            box-shadow: 0 20px 40px rgba(0,0,0,0.1);
            border-color: #667eea;
        }
        .number-circle {
            width: 40px;
            height: 40px;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            font-weight: bold;
            flex-shrink: 0;
        }
        .section-title {
            position: relative;
            padding-left: 20px;
        }
        .section-title::before {
            content: '';
            position: absolute;
            left: 0;
            top: 50%;
            transform: translateY(-50%);
            width: 4px;
            height: 24px;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            border-radius: 2px;
        }
        .highlight-box {
            background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
            background-clip: text;
            font-weight: 600;
        }
        .mermaid {
            display: flex;
            justify-content: center;
            margin: 2rem 0;
        }
        .icon-box {
            width: 60px;
            height: 60px;
            background: rgba(102, 126, 234, 0.1);
            border-radius: 12px;
            display: flex;
            align-items: center;
            justify-content: center;
            margin-bottom: 1rem;
        }
        .icon-box i {
            font-size: 24px;
            color: #667eea;
        }
        @keyframes fadeInUp {
            from {
                opacity: 0;
                transform: translateY(30px);
            }
            to {
                opacity: 1;
                transform: translateY(0);
            }
        }
        .animate-fadeInUp {
            animation: fadeInUp 0.6s ease-out;
        }
        .content-card {
            background: rgba(255, 255, 255, 0.95);
            backdrop-filter: blur(10px);
            border-radius: 16px;
            padding: 2rem;
            margin-bottom: 2rem;
        }
    </style>
</head>
<body>
    <!-- Hero Section -->
    <div class="hero-gradient text-white py-20">
        <div class="container mx-auto px-6 text-center">
            <h1 class="text-5xl font-bold mb-6 animate-fadeInUp">
                <i class="fas fa-memory mr-4"></i>
                Full GC 后的内存迷局
            </h1>
            <p class="text-xl opacity-90 max-w-3xl mx-auto animate-fadeInUp" style="animation-delay: 0.2s">
                深入探索 Java 虚拟机垃圾回收机制中的反直觉现象：为什么 Full GC 后老年代空间反而变小？
            </p>
        </div>
    </div>

    <!-- Main Content -->
    <div class="container mx-auto px-6 py-12">
        <!-- Introduction Card -->
        <div class="content-card animate-fadeInUp" style="animation-delay: 0.3s">
            <div class="icon-box">
                <i class="fas fa-question-circle"></i>
            </div>
            <p class="text-lg text-gray-700 leading-relaxed">
                在进行 Full GC 后，老年代的空间变小可能是由几个因素导致的。尽管 Full GC 旨在回收整个堆内存（包括新生代和老年代），但它有时可能会导致老年代空间减少。让我们深入探讨这个看似矛盾的现象背后的技术原理。
            </p>
        </div>

        <!-- Mermaid Diagram -->
        <div class="content-card animate-fadeInUp" style="animation-delay: 0.4s">
            <h2 class="text-2xl font-bold mb-6 text-gray-800 section-title">Full GC 影响因素全景图</h2>
            <div class="mermaid">
                graph TD
                    A[Full GC 执行] --> B[内存碎片整理]
                    A --> C[对象晋升机制]
                    A --> D[回收效率问题]
                    A --> E[内存分配策略]
                    A --> F[老年代压力]
                    
                    B --> B1[内存碎片化]
                    B --> B2[标记-整理算法]
                    
                    C --> C1[新生代对象晋升]
                    C --> C2[晋升失败处理]
                    
                    D --> D1[回收不完全]
                    D --> D2[回收策略差异]
                    
                    E --> E1[分配策略变化]
                    
                    F --> F1[高内存压力]
                    
                    style A fill:#667eea,stroke:#fff,stroke-width:3px,color:#fff
                    style B fill:#f093fb,stroke:#fff,stroke-width:2px,color:#fff
                    style C fill:#f093fb,stroke:#fff,stroke-width:2px,color:#fff
                    style D fill:#f093fb,stroke:#fff,stroke-width:2px,color:#fff
                    style E fill:#f093fb,stroke:#fff,stroke-width:2px,color:#fff
                    style F fill:#f093fb,stroke:#fff,stroke-width:2px,color:#fff
            </div>
        </div>

        <!-- Main Sections -->
        <div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
            <!-- Section 1: 碎片整理 -->
            <div class="card-hover content-card animate-fadeInUp" style="animation-delay: 0.5s">
                <div class="flex items-start mb-4">
                    <div class="number-circle mr-4">1</div>
                    <h3 class="text-2xl font-bold text-gray-800">碎片整理</h3>
                </div>
                
                <div class="space-y-4">
                    <div class="bg-purple-50 p-4 rounded-lg">
                        <h4 class="font-semibold text-purple-800 mb-2">
                            <i class="fas fa-puzzle-piece mr-2"></i>内存碎片化
                        </h4>
                        <p class="text-gray-700">
                            在老年代中，经过多次垃圾收集，可能会产生大量的内存碎片。Full GC 在回收过程中会整理内存，移除无用的对象，但也可能会导致旧的内存块被压缩成更小的块，从而减少可用的连续空间。
                        </p>
                    </div>
                    
                    <div class="bg-indigo-50 p-4 rounded-lg">
                        <h4 class="font-semibold text-indigo-800 mb-2">
                            <i class="fas fa-compress-alt mr-2"></i>标记-整理算法
                        </h4>
                        <p class="text-gray-700">
                            如果使用的是标记-整理算法（如老年代的垃圾收集器），它会将存活的对象移动到堆的一端，并释放整个堆的空间。这可能导致可用的空间看起来比之前小，因为整理的过程中空间被紧凑化。
                        </p>
                    </div>
                </div>
            </div>

            <!-- Section 2: 对象晋升 -->
            <div class="card-hover content-card animate-fadeInUp" style="animation-delay: 0.6s">
                <div class="flex items-start mb-4">
                    <div class="number-circle mr-4">2</div>
                    <h3 class="text-2xl font-bold text-gray-800">对象晋升</h3>
                </div>
                
                <div class="space-y-4">
                    <div class="bg-blue-50 p-4 rounded-lg">
                        <h4 class="font-semibold text-blue-800 mb-2">
                            <i class="fas fa-level-up-alt mr-2"></i>新生代对象晋升
                        </h4>
                        <p class="text-gray-700">
                            在 Full GC 过程中，新生代中的对象（特别是存活时间较长的对象）可能会晋升到老年代。如果新生代的对象大量晋升到老年代，可能会导致老年代空间的实际使用量增加，尽管这些对象是在 Full GC 之前已经被创建的。
                        </p>
                    </div>
                    
                    <div class="bg-red-50 p-4 rounded-lg">
                        <h4 class="font-semibold text-red-800 mb-2">
                            <i class="fas fa-exclamation-triangle mr-2"></i>晋升失败
                        </h4>
                        <p class="text-gray-700">
                            如果老年代空间不足以容纳这些晋升的对象，Full GC 可能会完成但无法释放足够的空间。
                        </p>
                    </div>
                </div>
            </div>

            <!-- Section 3: 回收效率 -->
            <div class="card-hover content-card animate-fadeInUp" style="animation-delay: 0.7s">
                <div class="flex items-start mb-4">
                    <div class="number-circle mr-4">3</div>
                    <h3 class="text-2xl font-bold text-gray-800">回收效率</h3>
                </div>
                
                <div class="space-y-4">
                    <div class="bg-yellow-50 p-4 rounded-lg">
                        <h4 class="font-semibold text-yellow-800 mb-2">
                            <i class="fas fa-chart-line mr-2"></i>回收不完全
                        </h4>
                        <p class="text-gray-700">
                            Full GC 在回收过程中可能并未完全清理所有的垃圾对象。尤其是当老年代的对象引用复杂或者存在许多长期存活的对象时，回收的效率可能会降低，导致空间回收不如预期。
                        </p>
                    </div>
                    
                    <div class="bg-green-50 p-4 rounded-lg">
                        <h4 class="font-semibold text-green-800 mb-2">
                            <i class="fas fa-cogs mr-2"></i>回收策略
                        </h4>
                        <p class="text-gray-700">
                            不同的垃圾收集器（如 CMS、G1 等）有不同的回收策略。某些策略可能更倾向于保留部分旧的对象以优化停顿时间，而不是完全清空老年代空间。
                        </p>
                    </div>
                </div>
            </div>

            <!-- Section 4: 内存分配策略 -->
            <div class="card-hover content-card animate-fadeInUp" style="animation-delay: 0.8s">
                <div class="flex items-start mb-4">
                    <div class="number-circle mr-4">4</div>
                    <h3 class="text-2xl font-bold text-gray-800">内存分配策略</h3>
                </div>
                
                <div class="bg-pink-50 p-4 rounded-lg">
                    <h4 class="font-semibold text-pink-800 mb-2">
                        <i class="fas fa-exchange-alt mr-2"></i>分配策略变化
                    </h4>
                    <p class="text-gray-700">
                        有时 JVM 的内存分配策略可能会发生变化，导致老年代的内存管理和分配方式发生改变。例如，JVM 可能会调整分配比例或者使用不同的内存池策略，从而影响老年代的实际可用空间。
                    </p>
                </div>
            </div>
        </div>

        <!-- Additional Sections -->
        <div class="grid grid-cols-1 lg:grid-cols-2 gap-8 mt-8">
            <!-- Section 5: 老年代压力 -->
            <div class="card-hover content-card animate-fadeInUp" style="animation-delay: 0.9s">
                <div class="flex items-start mb-4">
                    <div class="number-circle mr-4">5</div>
                    <h3 class="text-2xl font-bold text-gray-800">老年代压力</h3>
                </div>
                
                <div class="bg-orange-50 p-4 rounded-lg">
                    <h4 class="font-semibold text-orange